Amazon Linux 2のExtras Library(amazon-linux-extras)を使ってみた
Amazon Linux 2には Extras Library と呼ばれるパッケージ群が存在し、Python、Golang、MariaDB、Ansible などの特定のパッケージをより新しいバージョンで利用することが出来ます。 Extra Packages for Enterprise Linux (EPEL) のような位置づけで、通常はディストリビューション標準のパッケージを利用する一方で、特定のパケージではより新しいバージョンを試せます。
この特別なパッケージは AWS がキュレートし、amazon-linux-extras
コマンド経由で管理します。
今回はこの Extras Library を実際に使ってみます。
Extras Library は amazon-linux-extras コマンドで操作
Extras Library は専用プログラム amazon-linux-extras
で操作します。
以下の4つのサブコマンドがあります。
- help
- info
- install
- list
ヘルプメッセージを表示させてみましょう。
$ amazon-linux-extras help help See list of commands. info See details of a specific package. install Enables specified topics and installs their packages. list Lists topics in the catalog. Some may be enabled. Amazon Linux Extras software topics give you access to the most-recent stable software you specifically choose, without the uncertainty of a wholly new environment. Best practice is to enable only one or two topics. More than that, and you lose the benefits of working in a stable environment.
Extras Library の狙いは、安定した基盤にピンポイントで新しいソフトウェアをインストールすることです。 Extras Library 経由のインストールは 1、2個にとどめておくことがベストプラクティスです。
Extras Libraryで利用可能なトピックについて
Extras Library ではソフトウェア群のことを「トピック」と呼びます。
例えば、トピック Rust の場合、ランタイムの Rust
だけでなく、パッケージ管理やビルドを担う Cargo
もまとめてインストールされます。
利用可能なトピックの一覧は $ amazon-linux-extras list
あるいは単に $ amazon-linux-extras
コマンドで確認出来ます。
$ amazon-linux-extras 0 ansible2 disabled [ =2.4.2 ] 1 emacs disabled [ =25.3 ] 2 memcached1.5 disabled [ =1.5.1 ] 3 nginx1.12 disabled [ =1.12.2 ] 4 postgresql9.6 disabled [ =9.6.6 ] 5 python3 disabled [ =3.6.2 ] 6 redis4.0 disabled [ =4.0.5 ] 7 R3.4 disabled [ =3.4.3 ] 8 rust1 disabled [ =1.22.1 ] 9 vim disabled [ =8.0 ] 10 golang1.9 disabled [ =1.9.2 ] 11 ruby2.4 disabled [ =2.4.2 ] 12 nano disabled [ =2.9.1 ] 13 php7.2 disabled [ =7.2.0 ] 14 lamp-mariadb10.2-php7.2 disabled [ =10.2.10_7.2.0 ]
- トピック名(例: ansible2)
- インストールの有無(例:disabled/enabled)
- バージョン(2.4.2)
を一覧で確認出来ます。
Rust のような新しいソフトウェアがある一方で nano のような非常にレガシーなソフトウェアもあります。選定基準が気になります。
約1年のトピックの発展を確認
約1年後の 2018/12/17 時点でのトピックを確認します。
$ sudo amazon-linux-extras 0 ansible2 available [ =2.4.2 =2.4.6 ] 2 httpd_modules available [ =1.0 ] 3 memcached1.5 available [ =1.5.1 ] 4 nginx1.12 available [ =1.12.2 ] 5 postgresql9.6 available [ =9.6.6 =9.6.8 ] 6 postgresql10 available [ =10 ] 8 redis4.0 available [ =4.0.5 =4.0.10 ] 9 R3.4 available [ =3.4.3 ] 10 rust1 available \ [ =1.22.1 =1.26.0 =1.26.1 =1.27.2 ] 11 vim available [ =8.0 ] 12 golang1.9 available [ =1.9.2 ] 13 ruby2.4 available [ =2.4.2 =2.4.4 ] 15 php7.2=7.2.11 available \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 ] _ php7.1 available [ =7.1.22 ] 17 lamp-mariadb10.2-php7.2 available \ [ =10.2.10_7.2.0 =10.2.10_7.2.4 =10.2.10_7.2.5 =10.2.10_7.2.8 =10.2.10_7.2.11 ] 18 libreoffice available [ =5.0.6.2_15 =5.3.6.1 ] 19 gimp available [ =2.8.22 ] 20 docker available \ [ =17.12.1 =18.03.1 =18.06.1 ] 21 mate-desktop1.x available [ =1.19.0 =1.20.0 ] 22 GraphicsMagick1.3 available [ =1.3.29 ] 23 tomcat8.5 available [ =8.5.31 =8.5.32 ] 24 epel available [ =7.11 ] 25 testing available [ =1.0 ] 26 ecs available [ =stable ] 27 corretto8 available [ =1.8.0_192 ] 28 firecracker available [ =0.11 ]
28トピックと倍増しています。
firecracker のように re:Invent 2018 で発表されたばかりの新ソフトウェアも追加されています。
トピックの詳細を確認
トピックの詳細は $ amazon-linux-extras info TOPIC
コマンドで確認出来ます。
Extras Library は YUM でパッケージを管理しており、トピックを指定すると、トピックに紐づく各パッケージがインストールされます。
ruby2.4 の場合
$ amazon-linux-extras info ruby2.4 ruby2.4 recommends ruby # yum install ruby ruby2.4 recommends ruby-irb # yum install ruby-irb ruby2.4 recommends rubygem-rake # yum install rubygem-rake ruby2.4 recommends rubygem-json # yum install rubygem-json ruby2.4 recommends rubygems # yum install rubygems
php7.2 の場合
$ amazon-linux-extras info php7.2 php7.2 recommends php-cli # yum install php-cli php7.2 recommends php-pdo # yum install php-pdo php7.2 recommends php-fpm # yum install php-fpm php7.2 recommends php-json # yum install php-json php7.2 recommends php-mysqlnd # yum install php-mysqlnd
トピックをインストール
トピックのインストールは $ amazon-linux-extras install TOPIC
コマンドを使います。
$ sudo amazon-linux-extras install php7.2 Package php-cli-7.2.0-3.amzn2.1.x86_64 already installed and latest version Package php-fpm-7.2.0-3.amzn2.1.x86_64 already installed and latest version Package php-json-7.2.0-3.amzn2.1.x86_64 already installed and latest version Package php-mysqlnd-7.2.0-3.amzn2.1.x86_64 already installed and latest version Package php-pdo-7.2.0-3.amzn2.1.x86_64 already installed and latest version 0 ansible2 disabled [ =2.4.2 ] 1 emacs disabled [ =25.3 ] 2 memcached1.5 disabled [ =1.5.1 ] 3 nginx1.12 disabled [ =1.12.2 ] 4 postgresql9.6 disabled [ =9.6.6 ] 5 python3 disabled [ =3.6.2 ] 6 redis4.0 disabled [ =4.0.5 ] 7 R3.4 disabled [ =3.4.3 ] 8 rust1 disabled [ =1.22.1 ] 9 vim disabled [ =8.0 ] 10 golang1.9 disabled [ =1.9.2 ] 11 ruby2.4 disabled [ =2.4.2 ] 12 nano disabled [ =2.9.1 ] 13 php7.2=latest enabled [ =7.2.0 ] 14 lamp-mariadb10.2-php7.2 disabled [ =10.2.10_7.2.0 ] $ which php /usr/bin/php $ php -v PHP 7.2.0 (cli) (built: Dec 13 2017 00:38:30) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies $ yum info php-cli Loaded plugins: langpacks, update-motd Installed Packages Name : php-cli Arch : x86_64 Version : 7.2.0 Release : 3.amzn2.1 Size : 14 M Repo : installed From repo : amzn2extra-php7.2 Summary : Command-line interface for PHP URL : http://www.php.net/ License : PHP and Zend and BSD and MIT and ASL 1.0 Description : The php-cli package contains the command-line interface : executing PHP scripts, /usr/bin/php, and the CGI interface.
一覧から php7.2
の状態が disabled が enabled に変わっているのを確認出来ます。
topic=code
形式で明示的にトピックのバージョンを指定することも出来ます。
$ sudo amazon-linux-extras install php7.2=7.2.0 golang1.9=1.9.2
バージョンを指定しない場合は、デフォルトのバージョンでインストールされます。
現在はトピックとバージョンは1:1の関係ですが、いずれは、複数のバージョンが選択可能になるものと思われます。
2018/12/17 時点では
- Rust
- PHP
- lamp-mariadb10.2-php7.2
- Docker
で複数のバージョンから選択可能になっています。
例えば PHP の場合、次の様になっています。
$ amazon-linux-extras ... 15 php7.2=7.2.11 available \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 ] ...
最新バージョンの 7.2.11 をインストールしてみます。
$ sudo amazon-linux-extras install php7.2=7.2.11 ... Installed: php-cli.x86_64 0:7.2.11-1.amzn2.0.1 php-fpm.x86_64 0:7.2.11-1.amzn2.0.1 php-json.x86_64 0:7.2.11-1.amzn2.0.1 php-mysqlnd.x86_64 0:7.2.11-1.amzn2.0.1 php-pdo.x86_64 0:7.2.11-1.amzn2.0.1 Dependency Installed: php-common.x86_64 0:7.2.11-1.amzn2.0.1 Complete! ... 15 php7.2=7.2.11 enabled \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 ] ...
amazon-linux-extras
コマンド経由では、インストールされているトピックはわかるものの、トピックのバージョンまではわからないようです。
バージョンを知りたい場合は直接プログラムを呼び出して確認しましょう。
$ php -v PHP 7.2.11 (cli) (built: Oct 24 2018 17:51:11) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
extras 用レポジトリを有効化
トピックインストールは内部的には extras 用のレポジトリの追加とそのレポジトリ情報を利用したインストールの2段階の操作を行っています。 レポジトリだけを追加したい場合は enable コマンドを利用します。
/etc/yum.repos.d/amzn2-extras.repo ファイルが追加・更新されます。
$ sudo amazon-linux-extras enable php7.2 0 ansible2 disabled [ =2.4.2 ] 1 emacs disabled [ =25.3 ] 2 memcached1.5 disabled [ =1.5.1 ] 3 nginx1.12 disabled [ =1.12.2 ] 4 postgresql9.6 disabled [ =9.6.6 ] 5 python3 disabled [ =3.6.2 ] 6 redis4.0 disabled [ =4.0.5 ] 7 R3.4 disabled [ =3.4.3 ] 8 rust1 disabled [ =1.22.1 ] 9 vim disabled [ =8.0 ] 10 golang1.9 disabled [ =1.9.2 ] 11 ruby2.4 disabled [ =2.4.2 ] 12 nano disabled [ =2.9.1 ] 13 php7.2=latest enabled [ =7.2.0 ] 14 lamp-mariadb10.2-php7.2 disabled [ =10.2.10_7.2.0 ] Now you can install: # yum install php-cli php-pdo php-fpm php-json php-mysqlnd
トピックをアンインストール
トピックをアンインストールする手段が現時点では提供されていません。
ソースコードを見る限り disable
という隠れ?コマンドが存在するものの、サーバー内にある Extras Libraryの設定ファイルレベルで無効化するだけであり、YUM パッケージレベルで削除されるわけではありません。
$ sudo amazon-linux-extras disable php7.2 Beware that disabling topics is not supported after they are installed. 0 ansible2 disabled [ =2.4.2 ] 1 emacs disabled [ =25.3 ] 2 memcached1.5 disabled [ =1.5.1 ] 3 nginx1.12 disabled [ =1.12.2 ] 4 postgresql9.6 disabled [ =9.6.6 ] 5 python3 disabled [ =3.6.2 ] 6 redis4.0 disabled [ =4.0.5 ] 7 R3.4 disabled [ =3.4.3 ] 8 rust1 disabled [ =1.22.1 ] 9 vim disabled [ =8.0 ] 10 golang1.9 disabled [ =1.9.2 ] 11 ruby2.4 disabled [ =2.4.2 ] 12 nano disabled [ =2.9.1 ] 13 php7.2 disabled [ =7.2.0 ] 14 lamp-mariadb10.2-php7.2 disabled [ =10.2.10_7.2.0 ] $ php -v PHP 7.2.0 (cli) (built: Dec 13 2017 00:38:30) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
disable
コマンド実行直後にあるメッセージ "Beware that disabling topics is not supported after they are installed." の通りで、コマンド実行結果では disabled
となっていますが、パッケージ自体はインストールされたままです。
YUM でインストールされたのだから yum remove
経由でパッケージ単位での削除は可能です。
ただし Extras Library のトピックとしての整合性は崩れてしまうため、AT YOUR OWN RISK で実行して下さい。
$ sudo yum remove php-cli Loaded plugins: langpacks, update-motd Resolving Dependencies --> Running transaction check ---> Package php-cli.x86_64 0:7.2.0-3.amzn2.1 will be erased --> Finished Dependency Resolution amzn2-core/2017.12/x86_64 | 2.0 kB 00:00:00 Dependencies Resolved ===================================================================================================================================================================================== Package Arch Version Repository Size ===================================================================================================================================================================================== Removing: php-cli x86_64 7.2.0-3.amzn2.1 @amzn2extra-php7.2 14 M Transaction Summary ===================================================================================================================================================================================== Remove 1 Package Installed size: 14 M Is this ok [y/N]: y Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Erasing : php-cli-7.2.0-3.amzn2.1.x86_64 1/1 Verifying : php-cli-7.2.0-3.amzn2.1.x86_64 1/1 Removed: php-cli.x86_64 0:7.2.0-3.amzn2.1 Complete!
Extras Library の YUM レポジトリはどこ?
通常のパッケージと Extras パッケージのレポジトリは次のような構造になっています。
- AL2 通常 :
http://amazonlinux.$awsregion.$awsdomain/$releasever/$product/$pointrelease/$basearch/mirror.list
- AL2 Extra :
http://amazonlinux.$awsregion.$awsdomain/$releasever/extras/$extraname/$exactver/$sect/mirror.list
$extraname
はトピック名です。ansible2
や nano
などが入ります。
$extraname
はトピックのバージョンです。バージョンを指定せずにインストールした場合は latest
が入り、指定した場合はそのバージョンが入ります。
大きな違いとして、Extras 向けに $releasever
(リリースバージョン) の下層で extras
と切られています。
AL2 通常向けの詳細は次の記事を参照下さい。
また、通常のレポジトリは /etc/yum.repos.d/amzn2-core.repo
で管理される一方で、Extras は /etc/yum.repos.d/amzn2-extras.repo
で管理されています。
このファイルを実際に覗いてみましょう。
### This file is managed with amazon-linux-extras. Please manage with that tool. [amzn2extra-php7.2-source] enabled = 0 name = Amazon Extras source repo for php7.2 mirrorlist = http://amazonlinux.$awsregion.$awsdomain/$releasever/extras/php7.2/7.2.0/SRPMS/mirror.list gpgcheck = 1 [amzn2extra-php7.2-debuginfo] enabled = 0 name = Amazon Extras debuginfo repo for php7.2 mirrorlist = http://amazonlinux.$awsregion.$awsdomain/$releasever/extras/php7.2/7.2.0/debuginfo/$basearch/mirror.list gpgcheck = 1 [amzn2extra-php7.2] enabled = 0 name = Amazon Extras repo for php7.2 mirrorlist = http://amazonlinux.$awsregion.$awsdomain/$releasever/extras/php7.2/7.2.0/$basearch/mirror.list gpgcheck = 1
※ 空行は適宜除去しています
トピック一覧はどうやって管理している?
amazon-linux-extras
コマンドを実行するたびに最新のトピック一覧を取得しているようです。
最新トピックを取得する URL は http://amazonlinux.{awsregion}.{awsdomain}/{releasever}/extras-catalog.json
という形をしており、リリースバージョン毎に異なることを想定しているようです。
RC で利用可能なリリースバージョン(2017.12)でフランクフルトリージョン(eu-central-1)から取得してみます。
$ curl http://amazonlinux.eu-central-1.amazonaws.com/2017.12/extras-catalog.json {"motd": "", "status": "ok", "version": 1, "whitelists": [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]], "topics": [ {"n": "ansible2", "inst": ["ansible"], "versions": ["2.4.2"]}, {"n": "emacs", "inst": ["emacs"], "versions": ["25.3"]}, {"n": "memcached1.5", "inst": ["memcached"], "versions": ["1.5.1"], "visible": ["memcached", "memcached-devel"]}, {"n": "nginx1.12", "inst": ["nginx"], "versions": ["1.12.2"]}, {"n": "postgresql9.6", "inst": ["postgresql"], "versions": ["9.6.6"]}, {"n": "python3", "inst": ["python3", "python3-pip", "python3-setuptools", "python3-wheel"], "versions": ["3.6.2"]}, {"n": "redis4.0", "inst": ["redis"], "versions": ["4.0.5"]}, {"n": "R3.4", "inst": ["R"], "versions": ["3.4.3"]}, {"n": "rust1", "inst": ["rust", "cargo"], "versions": ["1.22.1"]}, {"n": "vim", "inst": ["vim-enhanced", "vim-minimal"], "versions": ["8.0"]}, {"n": "golang1.9", "inst": ["golang"], "versions": ["1.9.2"]}, {"n": "ruby2.4", "inst": ["ruby", "ruby-irb", "rubygem-rake", "rubygem-json", "rubygems"], "versions": ["2.4.2"]}, {"n": "nano", "inst": ["nano"], "versions": ["2.9.1"]}, {"n": "php7.2", "inst": ["php-cli", "php-pdo", "php-fpm", "php-json", "php-mysqlnd"], "versions": ["7.2.0"]}, {"n": "lamp-mariadb10.2-php7.2", "inst": ["php-cli", "php-pdo", "php-fpm", "php-json", "php-mysqlnd", "mariadb"], "versions": ["10.2.10_7.2.0"]} ]}
トピックphp7.2
を抜粋して、pretty print してみます。。
{ "n": "php7.2", "inst": [ "php-cli", "php-pdo", "php-fpm", "php-json", "php-mysqlnd" ], "versions": [ "7.2.0" ] },
n
: トピック名inst
: YUM でインストールされるパッケージversions
: トピックのバージョン
と推測されます。
amazon-linux-extras の実態
amazon-linux-extras
は YUM と同じく Python2 で書かれており、 /usr/lib/python2.7/site-packages/amazon_linux_extras/cli.py
にロジックのほぼ全てが詰まっています。
標準ライブラリだけで書かれており、コーディングスタイルもかなり保守的で、昔懐かし?の better shell 的な Python プログラムです。
まとめ
今回は Extras Library の使い方を紹介しました。
現時点では以下の2コマンドだけを覚えておけばOKです
$ amazon-linux-extras
$ sudo amazon-linux-extras install TOPIC-NAME
Extras Library のトピック管理はまだまだ荒削り感がありますが、専用のプログラムを用意しているので、時間の経過やトピックの種類・バージョンの充実により、より複雑な運用にも対応できるように、洗練されていくことを期待したいと思います。
後半はかなり趣味に走りましたが、現場からは以上です。